package com.itheima.service.mongo.impl;

import com.itheima.domain.mongo.Comment;
import com.itheima.domain.mongo.Movement;
import com.itheima.domain.vo.PageBeanVo;
import com.itheima.service.mongo.CommentService;
import org.apache.dubbo.config.annotation.DubboService;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.List;

@DubboService
public class CommentServiceImpl implements CommentService {

    @Autowired
    private MongoTemplate mongoTemplate;
    //保存comment  返回的int类型 其实是  动态的 点赞 喜欢 评论的人数
    @Override
    public Integer saveComment(Comment comment) {
        //1.保存动态
        mongoTemplate.save(comment);

        //2.修改动态表中的 动态的 点赞 喜欢 评论的人数

        //操作类型： 1-对动态点赞，2-对动态评论，3-对动态喜欢  4-对视频点赞   5-对视频评论  6-对视频喜欢
        if(comment.getCommentType() == 1){
            //查询动态
            Movement movement = mongoTemplate.findById(comment.getPublishId(), Movement.class);
            movement.setLikeCount( movement.getLikeCount()+1 ); //在原本的数量上+1
            mongoTemplate.save(movement); // 如果数据库有数据 save就是update 操作
            return movement.getLikeCount();
        }else if(comment.getCommentType() == 2){
            //查询动态
            Movement movement = mongoTemplate.findById(comment.getPublishId(), Movement.class);
            movement.setCommentCount( movement.getCommentCount() +1 ); //在原本的数量上+1
            mongoTemplate.save(movement); // 如果数据库有数据 save就是update 操作
            return movement.getCommentCount();
        }else if(comment.getCommentType() == 3){
            //查询动态
            Movement movement = mongoTemplate.findById(comment.getPublishId(), Movement.class);
            movement.setLoveCount( movement.getLoveCount() +1 ); //在原本的数量上+1
            mongoTemplate.save(movement); // 如果数据库有数据 save就是update 操作
            return movement.getLoveCount();
        }else {//后续自己改造
            return 0;
        }
    }

    /**
     * 删除动态
     * 张三对一个动态 进行了 点赞 评论 喜欢  数据库comment会产生三条数据  commentType不一样而已
     * 删除数据的同时: 知道删除的是 喜欢,评论还是点赞.
     *
     * commentType  动态的类型  确定是哪个类型的数据     publishId 确定哪个动态    userId  当前的点赞人评论是谁
     * @param userId  用户的id
     * @param publishId 动态id
     * @param commentType  动态的类型
     * @return
     */
    //
    @Override
    public Integer removeComment(Long userId, ObjectId publishId, Integer commentType) {
        //1.删除动态点赞 喜欢 评论
        Query query = new Query(
                Criteria.where("commentType").is(commentType)
                .and("userId").is(userId)
                .and("publishId").is(publishId)
        );
        mongoTemplate.remove(query , Comment.class);


        //2.修改动态表中的 动态的 点赞 喜欢 评论的人数

        //操作类型： 1-对动态点赞，2-对动态评论，3-对动态喜欢  4-对视频点赞   5-对视频评论  6-对视频喜欢
        if(commentType == 1){
            //查询动态
            Movement movement = mongoTemplate.findById(publishId, Movement.class);
            movement.setLikeCount( movement.getLikeCount()- 1 ); //在原本的数量上+1
            mongoTemplate.save(movement); // 如果数据库有数据 save就是update 操作
            return movement.getLikeCount();
        }else if(commentType == 2){
            //查询动态
            Movement movement = mongoTemplate.findById(publishId, Movement.class);
            movement.setCommentCount( movement.getCommentCount() - 1 ); //在原本的数量上+1
            mongoTemplate.save(movement); // 如果数据库有数据 save就是update 操作
            return movement.getCommentCount();
        }else if(commentType == 3){
            //查询动态
            Movement movement = mongoTemplate.findById(publishId, Movement.class);
            movement.setLoveCount( movement.getLoveCount() - 1 ); //在原本的数量上+1
            mongoTemplate.save(movement); // 如果数据库有数据 save就是update 操作
            return movement.getLoveCount();
        }else {//后续自己改造
            return 0;
        }

    }

    //分页查询动态评论
    @Override
    public PageBeanVo findCommentByPage(ObjectId publishId, Integer commentType, Integer pageNum, Integer pageSize) {
        //1.计算开始索引
        int startIndex = (pageNum -1) *pageSize;

        //2.查询数据
        Query query = new Query(
                Criteria.where("publishId").is(publishId)
                .and("commentType").is(commentType)
        ).with(Sort.by(Sort.Order.desc("created")))
                .skip(startIndex).limit(pageSize);
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);
        //3.查询总记录数
        long count = mongoTemplate.count(query, Comment.class);
        return new PageBeanVo(pageNum , pageSize , count ,commentList);
    }

    //查询 点赞 喜欢 评论
    @Override
    public PageBeanVo findMyCommentByPage(Long loginUserId, Integer commentType, Integer pageNum, Integer pageSize) {

        int startIndex =(pageNum-1)*pageSize;
        Query query = new Query(
                Criteria.where("publishUserId").is(loginUserId) //我的id
                .and("commentType").is(commentType) //类型
        ).skip(startIndex).limit(pageSize) //分页
                .with(Sort.by(Sort.Order.desc("created"))); //排序
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);
        long count = mongoTemplate.count(query, Comment.class);
        return new PageBeanVo(pageNum , pageSize , count , commentList);
    }
}
